
#pragma once
#include <vtkm/exec/arg/Fetch.h>
#include <vtkm/exec/arg/ExecutionSignatureTagBase.h>
#include <vtkm/exec/arg/AspectTagDefault.h>

#include "libmesh/elem.h"

using vtkm::exec::arg::Fetch;
struct FetchTagMeshIn
{
};

template<typename ExecObjectType>
struct Fetch<FetchTagMeshIn, vtkm::exec::arg::AspectTagDefault, ExecObjectType>
{
    using ValueType = libMesh::Elem;
    VTKM_SUPPRESS_EXEC_WARNINGS
    template <typename ThreadIndicesType>
    VTKM_EXEC
    ValueType Load(const ThreadIndicesType& indices, const ExecObjectType& arrayPortal) const
    {
        return arrayPortal + indices.GetInputIndex();
    }

    template <typename ThreadIndicesType>
    VTKM_EXEC void Store(const ThreadIndicesType&, ExecObjectType, const ValueType&) const
    {
        // Store is a no-op for this fetch.
    }
};